package com.cskaoyan.javase.oop2._1extends._9override._4exercise;

/**
 * 总结:
 *      方法的调用结果要根据对象的具体类型来决定
 *      在本案例中,在父类Father的构造器中打印getNum方法的结果
 *      而这个方法在子类中重写了
 *      这意味着:
 *      只要是创建子类对象,在父类构造器执行时,调用getNum方法,由于对象是子类类型
 *      getNum方法方法执行的结果一定是子类行为
 *      而在这个父类构造器执行的时期,子类成员变量的赋值还没有开始,子类的num只有默认值0
 *      所以此时getNum方法的结果是0
 *      只要是创建子类对象,程序的输出结果就是0
 *
 * @since 15:58
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // Son s = new Son();
        // Father fs = new Son();
        // Son s = new Son(300);

        Father f = new Father();
        Father f2 = new Father(300);
    }
}

class Father {
    int num = 100;

    public Father() {
        System.out.println(this.getNum());
    }

    public Father(int num) {
        System.out.println(this.getNum());
        this.num = num;
    }
    public int getNum() {
        return num;
    }
}

class Son extends Father {
    int num = 200;

    @Override
    public int getNum() {
        return num;
    }

    public Son() {
        // super();
    }

    // public Son(int num) {
    //     this.num = num;
    // }

    public Son(int num) {
        super(num);
    }
}
